clipboard: Add gdk_clipboard_set()
authorBenjamin Otte <otte@redhat.com>
Tue, 5 Dec 2017 04:16:49 +0000 (05:16 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 5 Dec 2017 04:29:03 +0000 (05:29 +0100)
This API allows specifying a GType and va_args of a value of that type
to set the clipboard contents. This massively simplifies setting weird
object types into the clipboard.
2 example patches included in this patch are the GtkTextBuffer and the
file list in the file chooser.

Using gobject-introspection, this should work without specifying the
type, so that you can literlally say
  clipboard.set ("Hello World")
or
  clipboard.set (pixbuf)
which is why I've also marked all other setters as (skip). They just
exist in C as wrappers for type safety reasons.

docs/reference/gdk/gdk4-sections.txt
gdk/gdkclipboard.c
gdk/gdkclipboard.h
gtk/gtkfilechooserwidget.c
gtk/gtktextbuffer.c

index dccf648e354f2c94301b01e2e203b9cfee273d2c..acb8d2abb88b01c5df3c43b155de92c11e94ca36 100644 (file)
@@ -1304,6 +1304,9 @@ gdk_clipboard_read_texture_finish
 gdk_clipboard_read_text_async
 gdk_clipboard_read_text_finish
 gdk_clipboard_set_content
+gdk_clipboard_set
+gdk_clipboard_set_valist
+gdk_clipboard_set_value
 gdk_clipboard_set_text
 gdk_clipboard_set_texture
 
index befbb08aef6ae2707120484b783b540a96997c78..2832fcad5053bb67ec001cf40fefce642a352a53 100644 (file)
@@ -30,8 +30,6 @@
 #include "gdkpipeiostreamprivate.h"
 #include "gdktexture.h"
 
-#include <gobject/gvaluecollector.h>
-
 /**
  * SECTION:gdkclipboard
  * @Short_description: Share data between applications for Copy-and-Paste
@@ -1235,104 +1233,32 @@ gdk_clipboard_set_content (GdkClipboard       *clipboard,
 }
 
 /**
- * gdk_clipboard_set:
- * @clipboard: a #GdkClipboard
- * @type: type of value to set
- * @...: value contents conforming to @type
- *
- * Sets the clipboard to contain the value collected from the given
- * varargs.
- **/
-void
-gdk_clipboard_set (GdkClipboard          *clipboard,
-                   GType                  type,
-                   ...)
-{
-  va_list args;
-                          
-  g_return_if_fail (GDK_IS_CLIPBOARD (clipboard));
-
-  va_start (args, type);
-  gdk_clipboard_set_valist (clipboard, type, args);
-  va_end (args);
-}
-
-/**
- * gdk_clipboard_set_valist: (skip)
+ * gdk_clipboard_set_text:
  * @clipboard: a #GdkClipboard
- * @type: type of value to set
- * @args: varargs containing the value of @type
+ * @text: Text to put into the clipboard
  *
- * Sets the clipboard to contain the value collected from the given
- * @args.
+ * Puts the given @text into the clipboard.
  **/
 void
-gdk_clipboard_set_valist (GdkClipboard *clipboard,
-                          GType         type,
-                          va_list       args)
+gdk_clipboard_set_text (GdkClipboard *clipboard,
+                        const char   *text)
 {
+  GdkContentProvider *provider;
   GValue value = G_VALUE_INIT;
-  char *error;
 
   g_return_if_fail (GDK_IS_CLIPBOARD (clipboard));
 
-  G_VALUE_COLLECT_INIT (&value, type,
-                        args, G_VALUE_NOCOPY_CONTENTS,
-                        &error);
-  if (error)
-    {
-      g_warning ("%s: %s", G_STRLOC, error);
-      g_free (error);
-      /* we purposely leak the value here, it might not be
-       * in a sane state if an error condition occoured
-       */
-      return;
-    }
-
-  gdk_clipboard_set_value (clipboard, &value);
+  g_value_init (&value, G_TYPE_STRING);
+  g_value_set_string (&value, text);
+  provider = gdk_content_provider_new_for_value (&value);
   g_value_unset (&value);
-}
-
-/**
- * gdk_clipboard_set_value: (rename-to gdk_clipboard_set)
- * @clipboard: a #GdkClipboard
- * @value: a #GValue to set
- *
- * Sets the @clipboard to contain the given @value.
- **/
-void
-gdk_clipboard_set_value (GdkClipboard *clipboard,
-                         const GValue *value)
-{
-  GdkContentProvider *provider;
-
-  g_return_if_fail (GDK_IS_CLIPBOARD (clipboard));
-  g_return_if_fail (G_IS_VALUE (value));
-
-  provider = gdk_content_provider_new_for_value (value);
 
   gdk_clipboard_set_content (clipboard, provider);
   g_object_unref (provider);
 }
 
 /**
- * gdk_clipboard_set_text: (skip)
- * @clipboard: a #GdkClipboard
- * @text: Text to put into the clipboard
- *
- * Puts the given @text into the clipboard.
- **/
-void
-gdk_clipboard_set_text (GdkClipboard *clipboard,
-                        const char   *text)
-{
-  g_return_if_fail (GDK_IS_CLIPBOARD (clipboard));
-
-  gdk_clipboard_set (clipboard, G_TYPE_STRING, text);
-}
-
-/**
- * gdk_clipboard_set_texture: (skip)
+ * gdk_clipboard_set_texture:
  * @clipboard: a #GdkClipboard
  * @texture: a #GdkTexture to put into the clipboard
  *
@@ -1342,9 +1268,18 @@ void
 gdk_clipboard_set_texture (GdkClipboard *clipboard,
                            GdkTexture   *texture)
 {
+  GdkContentProvider *provider;
+  GValue value = G_VALUE_INIT;
+
   g_return_if_fail (GDK_IS_CLIPBOARD (clipboard));
   g_return_if_fail (GDK_IS_TEXTURE (texture));
 
-  gdk_clipboard_set (clipboard, GDK_TYPE_TEXTURE, texture);
+  g_value_init (&value, GDK_TYPE_TEXTURE);
+  g_value_set_object (&value, texture);
+  provider = gdk_content_provider_new_for_value (&value);
+  g_value_unset (&value);
+
+  gdk_clipboard_set_content (clipboard, provider);
+  g_object_unref (provider);
 }
 
index 4f338b323bc9d816cef448cb09ed14a761ba7e76..02b13b01c897affae3506269549cec7fd3b5a33a 100644 (file)
@@ -103,17 +103,6 @@ GDK_AVAILABLE_IN_3_94
 gboolean                gdk_clipboard_set_content       (GdkClipboard          *clipboard,
                                                          GdkContentProvider    *provider);
 GDK_AVAILABLE_IN_3_94
-void                    gdk_clipboard_set               (GdkClipboard          *clipboard,
-                                                         GType                  type,
-                                                         ...);
-GDK_AVAILABLE_IN_3_94
-void                    gdk_clipboard_set_valist        (GdkClipboard          *clipboard,
-                                                         GType                  type,
-                                                         va_list                args);
-GDK_AVAILABLE_IN_3_94
-void                    gdk_clipboard_set_value         (GdkClipboard          *clipboard,
-                                                         const GValue          *value);
-GDK_AVAILABLE_IN_3_94
 void                    gdk_clipboard_set_text          (GdkClipboard          *clipboard,
                                                          const char            *text);
 GDK_AVAILABLE_IN_3_94
index 1d99534d3533e7473b036d7a0bbb2f49bdcd9415..dd75977c9656c84a7694530435a491332412c942 100644 (file)
@@ -1668,19 +1668,10 @@ copy_file_location_cb (GSimpleAction *action,
   if (selected_files)
     {
       GdkClipboard *clipboard;
-      GdkContentProvider *provider;
-      GValue value = G_VALUE_INIT;
 
       clipboard = gtk_widget_get_clipboard (GTK_WIDGET (impl));
-
-      g_value_init (&value, GDK_TYPE_FILE_LIST);
-      g_value_take_boxed (&value, selected_files);
-
-      provider = gdk_content_provider_new_for_value (&value);
-      g_value_unset (&value);
-
-      gdk_clipboard_set_content (clipboard, provider);
-      g_object_unref (provider);
+      gdk_clipboard_set (clipboard, GDK_TYPE_FILE_LIST, selected_files);
+      g_slist_free_full (selected_files, g_object_unref);
     }
 }
 
index b7d18056a9200bf94df375d1618c67178b520fc9..1dba4c4e001c5bb9cf77637fbc6fd20de932d5e6 100644 (file)
@@ -3927,19 +3927,10 @@ cut_or_copy (GtkTextBuffer *buffer,
   if (!gtk_text_iter_equal (&start, &end))
     {
       GtkTextBuffer *contents;
-      GdkContentProvider *provider;
-      GValue value = G_VALUE_INIT;
 
       contents = create_clipboard_contents_buffer (buffer, &start, &end);
-
-      g_value_init (&value, GTK_TYPE_TEXT_BUFFER);
-      g_value_take_object (&value, contents);
-
-      provider = gdk_content_provider_new_for_value (&value);
-      g_value_unset (&value);
-
-      gdk_clipboard_set_content (clipboard, provider);
-      g_object_unref (provider);
+      gdk_clipboard_set (clipboard, GTK_TYPE_TEXT_BUFFER, contents);
+      g_object_unref (contents);
 
       if (delete_region_after)
         {